iT邦幫忙

2025 iThome 鐵人賽

DAY 21
0
佛心分享-IT 人自學之術

OpwnCV影像處理新手村系列 第 21

🎯 DAY 21:霍夫轉換圓檢測(Hough Circle Transform)

  • 分享至 

  • xImage
  •  

本章將介紹如何利用霍夫轉換偵測影像中的圓形,並應用於實際案例,例如車輪、零件或硬幣辨識。透過參數調整與前處理,可提升圓形偵測的準確度與穩定性。


目錄

  1. 霍夫圓轉換原理
  2. OpenCV 提供的方法
  3. 影像前處理
  4. 霍夫圓檢測程式範例
  5. 方法參數與調整
  6. 應用案例與延伸

1. 霍夫圓轉換原理

  • 標準直線霍夫轉換是將直線表示為 (ρ, θ)

  • 對於圓,則使用方程式:
    [(x - a)^2 + (y - b)^2 = r^2]
    其中:

    • (a, b) 為圓心座標
    • r 為半徑
  • 在參數空間中,若許多邊緣點同時符合相同 (a, b, r),則累加器值增加,最終被判定為圓。


2. OpenCV 提供的方法

OpenCV 提供 cv2.HoughCircles() 來檢測圓形,建議搭配高斯模糊降噪,提升偵測穩定度。


3. 影像前處理

請準備一張圖片 clock.jpg(可用硬幣、鐘面或其他有圓形物件的圖片)。

import cv2
import numpy as np

# 讀取影像
img = cv2.imread("clock.jpg")
output = img.copy()

# 轉為灰階
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 高斯模糊,降低雜訊
gray_blur = cv2.GaussianBlur(gray, (9, 9), 2)

cv2.imshow("Original", img)
cv2.imshow("Gray Blur", gray_blur)

# 將以下程式碼放在所有顯示語句的最後面

cv2.waitKey()
cv2.destroyAllWindows()

原圖

GrayBlur


4. 霍夫圓檢測程式範例


# 使用霍夫轉換找圓
circles = cv2.HoughCircles(
  gray_blur, 
  cv2.HOUGH_GRADIENT, 
  dp=1, 
  minDist=30, 
  param1=100, 
  param2=30, 
  minRadius=10, 
  maxRadius=80
)


# 如果有找到圓,繪製在圖像上
if circles is not None:
  circles = np.uint16(np.around(circles))
  for (x, y, r) in circles[0, :]:
    # 繪製圓形邊界
    cv2.circle(output, (x, y), r, (0, 255, 0), 2)
    # 標示圓心位置
    cv2.circle(output, (x, y), 2, (0, 0, 255), 3)
cv2.imshow("Detected Circles", output)

霍夫圓檢測


5. 方法參數與調整

  • dp:累加器解析度與影像解析度比值,通常設為 1 或 2。
  • minDist:圓心之間的最小距離,避免檢測到過多重疊圓。
  • param1:邊緣檢測的高閾值 (Canny),影響邊緣偵測敏感度。
  • param2:累加器門檻值,越低會檢測到更多假圓,越高則只保留明顯圓。
  • minRadiusmaxRadius:限制檢測圓的半徑範圍,避免誤判。

6. 應用案例與延伸

常見應用:

  • 硬幣辨識 💰
  • 車輪與螺絲孔檢測 🚗🔩
  • 顯微鏡影像分析 🧬
  • 工業零件自動檢測 🏭

方法比較

方法 適用場景 優點 缺點
HoughCircles 圓形物件偵測 參數彈性高、可偵測多圓 對雜訊敏感、需前處理

HoughCircles 適合偵測多個圓形物件,參數可依需求調整。若雜訊多或圓形邊緣不明顯,建議加強前處理(如模糊、二值化)。


📖 今日結語

霍夫圓轉換是檢測影像中圓形物件的強大工具。只要適當調整參數並加強前處理,就能靈活應用於各種場景,從日常影像處理到工業自動化檢測。



上一篇
🚀 DAY 20:霍夫轉換直線檢測(Hough Line Transform)
下一篇
🚀 DAY 22:特徵點檢測(Feature Detection)|Harris Corner、Shi-Tomasi
系列文
OpwnCV影像處理新手村22
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言